Der Zweck dieser Seite ist es, Beispiele auf fortgeschrittenem Niveau für den PySide-GUI-Verwalter zu behandeln (es gibt begleitende Seiten PySide Beispiele für Anfänger und PySide Weiterführende Beispiele).
Durch Verwendung des PySide Moduls innerhalb von FreeCAD, hast du die volle Kontrolle über seine Oberfläche. Du kannst zum Beispiel:
Soll an der FreeCAD-Oberfläche gearbeitet werden, muss als allererstes eine Referenz auf das FreeCAD-Hauptfenster erstellt werden:
import sys
from PySide import QtGui ,QtCore
app = QtGui.qApp
mw = FreeCADGui.getMainWindow()
Anschließend kannst du beispielsweise alle Widgets der Benutzeroberfläche durchsuchen:
for child in mw.children():
print('widget name = ', child.objectName(), ', widget type = ', child)
Die Widgets in einer Qt-Schnittstelle sind normalerweise in „Container“-Widgets verschachtelt, sodass die untergeordneten Elemente unseres Hauptfensters selbst andere untergeordnete Elemente enthalten können. Je nach Widgettyp kannst du viele Dinge tun. Schau dir die API-Dokumentation an, um zu sehen, was möglich ist.
Das Hinzufügen eines neuen Widgets, beispielsweise eines DockWidgets (das in einer der Seitenleisten von FreeCAD platziert werden kann), ist einfach:
myWidget = QtGui.QDockWidget()
mw.addDockWidget(QtCore.Qt.RightDockWidgetArea,myWidget)
Du kannst dann Dinge direkt zu deinem Widget hinzufügen:
myWidget.setObjectName("my Nice New Widget")
myWidget.resize(QtCore.QSize(300,100)) # sets size of the widget
label = QtGui.QLabel("Hello World", myWidget) # creates a label
label.setGeometry(QtCore.QRect(2,50,200,24)) # sets its size
label.setObjectName("myLabel") # sets its name, so it can be found by name
Eine bevorzugte Methode ist jedoch, ein UI-Objekt zu erstellen, das die gesamte Einrichtung deines Widgets auf einmal übernimmt. Der große Vorteil besteht darin, dass ein solches UI-Objekt mit dem Programm Qt Designer grafisch erstellt werden kann. Ein typisches von Qt Designer generiertes Objekt sieht folgendermaßen aus:
class myWidget_Ui(object):
def setupUi(self, myWidget):
myWidget.setObjectName("my Nice New Widget")
myWidget.resize(QtCore.QSize(300,100).expandedTo(myWidget.minimumSizeHint())) # sets size of the widget
self.label = QtGui.QLabel(myWidget) # creates a label
self.label.setGeometry(QtCore.QRect(50,50,200,24)) # sets its size
self.label.setObjectName("label") # sets its name, so it can be found by name
def retranslateUi(self, draftToolbar): # built-in QT function that manages translations of widgets
myWidget.setWindowTitle(QtGui.QApplication.translate("myWidget", "My Widget", None, QtGui.QApplication.UnicodeUTF8))
self.label.setText(QtGui.QApplication.translate("myWidget", "Welcome to my new widget!", None, QtGui.QApplication.UnicodeUTF8))
Um es zu verwenden, musst du es nur wie folgt auf dein neu erstelltes Widget anwenden:
app = QtGui.qApp
FCmw = app.activeWindow()
myNewFreeCADWidget = QtGui.QDockWidget() # create a new dckwidget
myNewFreeCADWidget.ui = myWidget_Ui() # load the Ui script
myNewFreeCADWidget.ui.setupUi(myNewFreeCADWidget) # setup the ui
FCmw.addDockWidget(QtCore.Qt.RightDockWidgetArea,myNewFreeCADWidget) # add the widget to the main window
Der Schlüssel zum erfolgreichen Laden einer UI-Datei ist die Verwendung des vollständigen Pfads zur Datei. Der Addon Manager macht es beispielsweise so:
self.dialog = FreeCADGui.PySideUic.loadUi(os.path.join(os.path.dirname(__file__), "AddonManager.ui"))